package com.atguigu.day13.teacher.in1;

/*
普通成员内部类:
    位置: 外部类的内部 外部类方法的外面
          class A{ class B{} }
    注意:
        1.外部类只能被public 缺省的修饰
          普通成员内部类 可以使用四种访问权限

        2.内部类可以使用外部类资源
          外部类也可以使用内部类资源

        3.打破java的单继承限制

        4.外部可以直接使用内部类资源
            静态资源   外部类名.内部类名.资源名   Outer.Inner.innerMethod02();
            非静态资源  创建内部类对象  外部类名.内部类名 对象名 = new 外部类名().new 内部类名()
                                      Outer.Inner inner = new Outer().new Inner();

        5.内部类会有独立的字节码文件 命名方式
               外部类名$内部类名.class  Outer$Inner.class

        6.普通成员内部类和外部类有独立的this
           外部类this: 外部类名.this






 */
class B {
    public void eat() {
        System.out.println("B eat()");
    }
}

class C {
    public void sleep() {
        System.out.println("C sleep()");
    }
}

public class Outer extends B {
    String name = "Outer";
    static String country = "China";

    public void outerMethod01() {
        System.out.println("外部类方法 outerMethod01");
    }

    public void outerMethod02() {
        // System.out.println(age);
        Inner inner = new Inner();
        System.out.println("inner.age = " + inner.age);
        Inner.innerMethod02();
        inner.innerMethod();
    }

    public void outerMethod03() {
        eat();
        Inner inner = new Inner();
        inner.sleep();
    }

    //普通成员内部类
    class Inner extends C {

        int age = 20;

        public static void innerMethod02() {
            System.out.println("Inner static innerMethod02");
        }

        public void innerMethod() {
            System.out.println("name = " + name);
            System.out.println("country = " + country);
            outerMethod01();
        }

    }

}
